package demo2;

//泛型的上界

//class Alg {
//
//    public int findMax(int[] array) {
//        int max = array[0];
//        for (int i = 1; i < array.length; i++) {
//            if(max < array[i]) {
//                max = array[i];
//            }
//        }
//        return max;
//    }
//}

//<E ectends N>  泛型的上界
//E extends Number   E是Number的子类或者是Number本身
//代表将来指定的参数类型一定是实现了该接口的
class Alg1 <E extends Number> {

    //E是Number的子类或者是Number本身
}
class Alg<E extends Comparable<E>> {
    //代表将来指定的参数类型一定是实现了该接口的
    public E findMax(E[] array) {
         E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(max.compareTo(array[i]) < 0) {
                max = array[i];
            }
//            此处的E被擦除为Object，但是Object是没有实现Comparable接口的，所以没有比较方法
//            if(max < array[i]) {
//                max = array[i];
//                报错，因为不是所有的数据都能通过大于号小于号比较的
//            }
        }
        return max;
    }
}

public class Test {
    public static void main1(String[] args) {
        Alg<Integer> alg = new Alg<>();
        Integer[] array = {13,2,43,2,42,2};
        Integer val = alg.findMax(array);
        System.out.println(val);
    }

    public static void main2(String[] args) {
        Alg3 alg3 = new Alg3();
        Integer[] array = {23,2,2143,232,42,12};
        Integer val1 = alg3.<Integer>findMax(array);
        //可以省略参数，会根据传递的类型自己判断是什么类型
        Integer val2 = alg3.findMax(array);
        System.out.println(val1);
    }

    public static void main(String[] args) {
        Integer[] array = {23,2,2143,232,42,12};
        Integer val1 = Alg4.<Integer>findMax(array);
        System.out.println(val1);
    }
}

//泛型方法

class Alg3 {

    public <E extends Comparable<E>>E findMax(E[] array) {
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(max.compareTo(array[i]) < 0) {
                max = array[i];
            }

        }
        return max;
    }

    public static void main(String[] args) {

    }
}

class Alg4 {

    public static <E extends Comparable<E>>E findMax(E[] array) {
        E max = array[0];
        for (int i = 1; i < array.length; i++) {
            if(max.compareTo(array[i]) < 0) {
                max = array[i];
            }

        }
        return max;
    }

    public static void main(String[] args) {

    }
}
